package com.nancy.java_design.singleton.demo6;

import java.io.Serializable;

/**
 * 单例模式
 *  静态内部类方式
 *  静态内部类单例模式中实例由内部类创建，由于 ! 在加载外部类的过程中，是不会加载静态内部类的，只有内部类的属性/方法被调用时才会被加载，
 *  并初始化其静态属性。静态属性由于被 static 修饰，保证只被实例化一次，并且严格保证实例化顺序（防止了指令重排问题）。
 */
public class Singleton implements Serializable {

    private static boolean flag = false;

    // 1. 私有化构造方法
    private Singleton() {
        // 2.多线程安全问题
        synchronized (Singleton.class){
            //判断flag，如果是true，说明不是第一次访问，则抛出异常
            if (flag) {
                throw new RuntimeException("不能创建多个对象");
            }
            flag = true;
        }

    }

    // 2.定义一个静态内部类
    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    // 3.提供公共方法
    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }

    // 4. 防止反序列化破坏单例模式
    private Object readResolve(){
        return SingletonInstance.INSTANCE;
    }
}
